package com.sky.config;


import com.sky.interceptor.JwtTokenAdminInterceptor;
import com.sky.json.JacksonObjectMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

import java.util.List;

/**
 * 配置类，注册web层相关组件
 *
 * @Author: Zhy
 * @Date: 2025-01-14 14:55
 * @Version: 1.0
 */
@Configuration
@Slf4j
@RequiredArgsConstructor
public class WebMvcConfiguration extends WebMvcConfigurationSupport {
	private final JwtTokenAdminInterceptor jwtTokenAdminInterceptor;


	/**
	 * 注册自定义拦截器
	 *
	 * @param: registry
	 */
	@Override
	protected void addInterceptors(InterceptorRegistry registry) {
		log.info("开始注册自定义拦截器...");
		//  配置后台服务端
		registry.addInterceptor(jwtTokenAdminInterceptor)
			.addPathPatterns("/admin/**")
			.excludePathPatterns("/admin/employee/login")
			.excludePathPatterns("/admin/order/completeByNumber")
			.excludePathPatterns("/admin/order/reminderNewOrders")
			.excludePathPatterns("/admin/order/reminder")
			.excludePathPatterns("/admin/merchant/getShopById")
			.excludePathPatterns("/admin/order/changeOrderStatus")
			.excludePathPatterns("/admin/order/getAddressByOrderNumber");

		//  配置小程序用户端
	}

	/**
	 * 设置静态资源映射
	 *
	 * @param: registry
	 */
	@Override
	protected void addResourceHandlers(ResourceHandlerRegistry registry) {
		//  swagger配置可访问
		registry.addResourceHandler("/doc.html")
			.addResourceLocations("classpath:/META-INF/resources/");
		//  扫描支付静态资源文件
		registry.addResourceHandler("/**")
			.addResourceLocations("classpath:/static/");
		// cpolar 映射可访问资源
		registry.addResourceHandler("/webjars/**")
			.addResourceLocations("classpath:/META-INF/resources/webjars/");
	}

	/**
	 * 通过knife4j生成接口文档
	 *
	 * @return:
	 */
	@Bean
	public Docket docket() {
		ApiInfo apiInfo = new ApiInfoBuilder().title("苍穹外卖项目接口文档")
			.version("2.0")
			.description("苍穹外卖项目接口文档")
			.build();
		Docket docket = new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo)
			.select()
			.apis(RequestHandlerSelectors.basePackage("com.sky.controller"))
			.paths(PathSelectors.any())
			.build();
		return docket;
	}


	/**
	 * 扩展 mvc 框架的消息转换器
	 *
	 * @return:
	 * @param: converters 消息转换器列表
	 */
	@Override
	protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
		log.info("开始扩展消息转换器...");

		// 创建一个消息转化器对象
		MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
		// 设置对象转换器，可以将 Java 对象转为 json 字符串
		converter.setObjectMapper(new JacksonObjectMapper());

		// 将我们自己的转换器放入 spring MVC 框架的容器中（并排在最前面，优先使用）
		converters.add(0, converter);
	}
}
